package com.aididi.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @Auther: zx.xu
 * @Description:
 */
@Service
public class RibbonBackService {

    @Autowired
    RestTemplate restTemplate;

    //hystrix配置ribbon服务熔断
    //断路器保持在开路状态一段时间后 (默认 5 秒)，自动切换到半开路状态 (HALF-OPEN)。这时会判断下一次请求的返回情况，如果请求成功，断路器切回闭路状态 (CLOSED)，否则重新切换到开路状态 (OPEN)。
    @HystrixCommand(fallbackMethod = "getErrorInfo",
            commandProperties = {
            // 是否启用服务熔断
            @HystrixProperty(name = "circuitbreaker.enabled",value = "true"),
            // 请求阈值:在快照时间窗内，必须满足请求总数下限才有资格进行熔断。默认为 20，意味着在 10 秒内，如果该 Hystrix Command 的调用此时不足 20 次，即时所有的请求都超时或其他原因失败，断路器都不会打开
            @HystrixProperty(name = "circuitbreaker.requestVolumeThreshold",value = "20"),
            //时间窗口,断路器确定是否打开需要统计一些请求和错误数据，而统计的时间范围就是快照时间窗，默认为最近的 10 秒
            @HystrixProperty(name = "circuitbreaker.sleepWindowInMilliseconds",value = "10000"),
            //失败比率,在时间窗口内请求次数达到请求阈值，并且失败比率达到配置的50%，才会打开断路器
            @HystrixProperty(name = "circuitbreaker.errorThresholdPercentage",value = "50"),
            })
    public String sayHi(String name){
        return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
    }

    public String getErrorInfo(String name){
        return "sorry:"+name+",i am ribbon fallback";
    }


}
